package com.shouhuyun.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.shouhuyun.dao.RoleDao;
import com.shouhuyun.entity.PageResult;
import com.shouhuyun.entity.QueryPageBean;
import com.shouhuyun.pojo.Permission;
import com.shouhuyun.pojo.Role;
import com.shouhuyun.service.RoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service(interfaceClass = RoleService.class)
@Transactional
public class RoleServiceImpl implements RoleService {

    @Autowired
    private RoleDao roleDao;

    // 分页查询所有的角色信息
    public PageResult pageQuery(QueryPageBean queryPageBean) {
        // 1. 通过queryPageBean 获取分页查询的条件
        Integer currentPage = queryPageBean.getCurrentPage();
        Integer pageSize = queryPageBean.getPageSize();
        String queryString = queryPageBean.getQueryString();
        //完成分页查询，基于mybatis框架提供的分页助手插件完成
        //提供当前页和页面大小
        PageHelper.startPage(currentPage,pageSize);

        if (queryString!=null){
            queryString = "%"+queryString+"%";
        }

        Page<Role> page = roleDao.selectByCondition(queryString);
        long total = page.getTotal();
        List<Role> rows = page.getResult();
        return new PageResult(total,rows);
    }

    // 根据id查询角色  包括菜单跟权限
    public Role findById(Integer id) {
        Role role = roleDao.findById(id);
        return role;
    }

    // 根据角色id查询相关联的权限ids
    public List<Integer> findPermissionIdsByRoleId(Integer id) {
        List<Integer> list = roleDao.findPermissionIdsByRoleId(id);
        return list;
    }

    // 根据角色ID查询角色包含的多个菜单id
    public List<Integer> findMenuIdsByRoleId(Integer id) {
        List<Integer> list = roleDao.findMenuIdsByRoleId(id);
        return list;
    }

    // 编辑 角色信息(权限菜单的更新)
    public void edit(Role role, Integer[] permissionIds, Integer[] menusIds) {
        //修改角色基本信息  t_role
        roleDao.edit(role);
        //先清理关联关系   清理当前角色关联的权限 和 菜单
        roleDao.deleteAssociationPermission(role.getId());
        roleDao.deleteAssociationMenu(role.getId());
        //在建立新的关联
        Integer roleId = role.getId();
        //遍历检查项数据
        this.setRoleAndPermission(roleId,permissionIds);
        this.setRoleAndMenu(roleId,menusIds);


    }

    // 删除角色
    public void delete(Integer id) {
        //判断当前角色是否已经关联到用户
        long count = roleDao.findCountByRoleId(id);
        if(count > 0){
            //当前角色已经被关联到用户，不允许删除
            throw new RuntimeException();   /*抛出一个异常*/
        }
        //删除 角色 以及角色和权限 菜单 的关系
        roleDao.deleteByIdInRoleAndPermission(id);
        roleDao.deleteByIdInRoleAndMenu(id);
        roleDao.deleteById(id);
    }


    // 添加role角色信息  及相关联信息( permission  menu )
    public void add(Role role, Integer[] permissionIds,Integer[] menusIds) {
        // 1. 添加role 角色信息
        // 需要新增role的时候把id返回
        roleDao.add(role);
        // 1.1 获取新增的role的id
        Integer id = role.getId();
        // 2. 设置role与permission的关联关系
        this.setRoleAndPermission(id,permissionIds);
        // 3. 设置role与menu的关联关系
        this.setRoleAndMenu(id,menusIds);
    }

    @Override
    public List<Role> findAll() {

        return roleDao.findAll();
    }

    // 设置role和permission的关联关系
    public void setRoleAndPermission(Integer RoleId,Integer[] permissionIds){
        if (permissionIds != null && permissionIds.length > 0){
            for (Integer permissionId : permissionIds) {
                //创建map集合
                Map<String,Integer> map = new HashMap<>();
                map.put("RoleId",RoleId);
                map.put("permissionId",permissionId);
                roleDao.setRoleAndPermission(map);
            }
        }
    }
    // 设置role和menu的关联关系
    public void setRoleAndMenu(Integer RoleId,Integer[] menusIds){
        if (menusIds != null && menusIds.length > 0){
            for (Integer menuId : menusIds) {
                //创建map集合
                Map<String,Integer> map = new HashMap<>();
                map.put("RoleId",RoleId);
                map.put("menuId",menuId);
                roleDao.setRoleAndMenu(map);
            }
        }
    }
}
